/*!
 * # 模块 Api 类:
 *  Users - 用户管理
 * 
 * # 描述:
 *  向系统管理人员提供用户的管理功能，包括为用户设置权限。
 *  
 *  Copyright (c), 上海沃恩信息科技有限公司.
 *  All rights reserved.
 *  Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Pittypat;

namespace Waln.Authority.Users
{
	/// <summary>
	/// 提供对模块 用户管理 中功能的封装和调用。
	/// </summary>
	[global::Pittypat.Module(global::Pittypat.ModulePresentation.UI, AllowAnonymous = false)]
	public sealed class Api : global::Pittypat.Module
	{
		#region ListAsync

		/// <summary>
		/// 查询并显示系统中已经注册的所有用户。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回所有输出参数的字典，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> ListAsync(
			global::Pittypat.FunctionModel<Args.List> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回所有输出参数的字典
			return model.Success ? model.OutArgs : null;
		}

		#endregion

		#region AddAsync

		/// <summary>
		/// 添加一个新的用户账号。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 新用户，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> AddAsync(
			global::Pittypat.FunctionModel<Args.Add> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回新用户
			return model.Success ? model.Args.User : null;
		}

		#endregion

		#region EditAsync

		/// <summary>
		/// 设置指定用户的用户资料，不包括登录密码。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 用户信息，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> EditAsync(
			global::Pittypat.FunctionModel<Args.Edit> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回用户信息
			return model.Success ? model.Args.User : null;
		}

		#endregion

		#region SetPasswordAsync

		/// <summary>
		/// 设置指定用户的登录密码。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>没有输出参数，默认总是返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> SetPasswordAsync(
			global::Pittypat.FunctionModel<Args.SetPassword> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// model.Args 没有定义输出参数
			return null;
		}

		#endregion

		#region SetFaceAsync

		/// <summary>
		/// 设置指定用户的用户头像。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 原用户头像路径，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> SetFaceAsync(
			global::Pittypat.FunctionModel<Args.SetFace> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

            if (model.Success)
            {
                // 保存成功，删除原头像文件
                global::Pittypat.Web.VirtualFile.Delete(model.Args.OldFaceUrl);
            }
            else
            {
                // 保存失败，删除已经上传的新文件
                global::Pittypat.Web.VirtualFile.Delete(model.Args.FaceUrl);
            }

            return null;
        }

		#endregion

		#region LockAsync

		/// <summary>
		/// 锁定或者解锁用户。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 用户信息，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> LockAsync(
			global::Pittypat.FunctionModel<Args.Lock> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回用户信息
			return model.Success ? model.Args.User : null;
		}

		#endregion

		#region DeleteAsync

		/// <summary>
		/// 删除指定的用户账号。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>没有输出参数，默认总是返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> DeleteAsync(
			global::Pittypat.FunctionModel<Args.Delete> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);
            
			// model.Args 没有定义输出参数
			return null;
		}

		#endregion

		#region AppsAsync

		/// <summary>
		/// 查询已经安装的所有 App 的列表。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 App 列表，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> AppsAsync(
			global::Pittypat.FunctionModel<Args.Apps> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回App 列表
			return model.Success ? model.Args.List : null;
		}

		#endregion

		#region ModulesAsync

		/// <summary>
		/// 查询隶属于指定 App 的模块的列表。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 模块列表，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> ModulesAsync(
			global::Pittypat.FunctionModel<Args.Modules> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回模块列表
			return model.Success ? model.Args.List : null;
		}

		#endregion

		#region GrantAsync

		/// <summary>
		/// 为指定的部门、岗位或用户添加一个权限。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>没有输出参数，默认总是返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> GrantAsync(
			global::Pittypat.FunctionModel<Args.Grant> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// model.Args 没有定义输出参数
			return null;
		}

		#endregion

		#region RevokeAsync

		/// <summary>
		/// 删除一个权限。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>没有输出参数，默认总是返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> RevokeAsync(
			global::Pittypat.FunctionModel<Args.Revoke> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// model.Args 没有定义输出参数
			return null;
		}

		#endregion
	}
}
